<div>
  Логически израз, който определя кои агенти могат да изграждат този проект.
  Изразът ще се изчисли с всеки етикет и име на всеки наличен агент и резултатът
  ще е или
  <i>истина</i>
  , или
  <i>лъжа</i>
  . Само когато изразът се изчисли като
  <i>истина</i>
  , агентът ще може да изгражда този проект.
  <p>
    Ако проектът трябва задължително да се изгражда на определен подчинен
    компютър или на основния, въведете съответно името на компютъра или
    <code>built-in</code>
    .
  </p>

  <p>
    Като цяло трябва да избягвате употребата на
    <i>името</i>
    на подчинения компютър като вместо това използвате
    <i>етикетите</i>
    на компютрите. Както е документирано на страницата за настройки на всеки
    агент и страницата за
    <i>Системни настройки</i>
    на основния компютър, етикетите могат да се използват за определяне на кои
    операционни системи върви Jenkins, каква е архитектурата на процесора както
    и на всякакви други характеристики.
    <br />
    Като използвате етикети елиминирате нуждата да преправяте етикетните изрази
    всеки път като добавяте, махате или преименувате машини.
  </p>

  <p>
    Етикетният израз може да е съвсем прост, напр. единичен
    <b>етикет</b>
    или
    <b>име на машина</b>
    като
    <code>android-builder</code>
    или
    <code>linux-machine-42</code>
    .
    <br />
    Може да ползвате и някои
    <i>оператори</i>
    , за да създавате по-сложни изрази.
  </p>

  <h3>Поддържани оператори</h3>
  Поддържат се следните оператори в намаляващ приоритет:
  <dl>
    <dt><code>(израз)</code></dt>
    <dd>скоби — за изрично указване на приоритета на операция</dd>

    <dt><code>!израз</code></dt>
    <dd>
      НЕ — отрицание, стойността на
      <code>израза</code>
      трябва да
      <b>не</b>
      е истина.
    </dd>

    <dt><code>a &amp;&amp; b</code></dt>
    <dd>
      И —
      <b>и двата</b>
      израза
      <code>a</code>
      и
      <code>b</code>
      трябва да са истина.
    </dd>

    <dt><code>a || b</code></dt>
    <dd>
      ИЛИ —
      <b>някой от</b>
      изразите
      <code>a</code>
      или
      <code>b</code>
      трябва да е истина.
    </dd>

    <dt><code>a -> b</code></dt>
    <dd>
      ИМПЛИКАЦИЯ — АКО - ТО, същото като
      <code>!a || b</code>
      .
      <br />
      Напр.
      <code>windows -> x64</code>
      означава: „ако се ползва компютър под Windows, той
      <i>трябва</i>
      да е 64-битов“, което също позволява проектът да бъде изграждан на машини
      <i>без</i>
      етикета
      <code>windows</code>
      , без значение дали имат или не етикета
      <code>x64</code>
      .
    </dd>

    <dt><code>a &lt;-> b</code></dt>
    <dd>
      ЕКВИВАЛЕНТНОСТ — АКО И САМО АКО, същото като
      <code>a &amp;&amp; b || !a &amp;&amp; !b</code>
      <br />
      Напр.
      <code>windows &lt;-> dc2</code>
      означава: „ако се ползва компютър под Windows, той
      <i>трябва</i>
      да е в центъра за данни № 2, ако обаче се ползва компютър, който не е под
      Windows, той
      <i>не трябва</i>
      да е в центъра за данни № 2“.
    </dd>
  </dl>

  <h3>Бележки</h3>
  <ul>
    <li>
      Асоциативността на всички оператори е лява, т. е.
      <code>a -> b -> c</code>
      означава:
      <code>(a -> b) -> c</code>
      .
    </li>
    <li>
      Етикетите или имената на компютрите може да са заградени в кавички, ако
      съдържат знаци, които противоречат на синтаксиса на операторите.
      <br />
      Напр.
      <code>"osx (10.11)" || "Windows Server"</code>
      .
    </li>
    <li>
      Не е задължително да слагате интервали в изразите, но е добре да го
      правите за четимост. Jenkins прескача празните знаци при изчисляването на
      изразите.
    </li>
    <li>
      Напасване на етикетите или имената на компютрите с шаблони или регулярни
      изрази не се поддържа.
    </li>
    <li>
      Празен израз се изчислява като
      <i>истина</i>
      и напасва всички машини.
    </li>
  </ul>

  <h3>Примери</h3>
  <dl>
    <dt><code>built-in</code></dt>
    <dd>
      Изгражданията на този проект може да са само на основния компютър на
      Jenkins.
    </dd>

    <dd></dd>

    <dt><code>linux-machine-42</code></dt>
    <dd>
      Проектът може да бъде изграден само на агент с име
      <code>linux-machine-42</code>
      (или на всяка машина, която има етикет на име
      <code>linux-machine-42</code>
      ).
    </dd>

    <dt><code>windows &amp;&amp; jdk9</code></dt>
    <dd>
      Изгражданията може да се извършат на всеки подчинен компютър, който е с
      Windows и има версия 9 на комплекта за разработчици на Java (като
      приемаме, че всеки компютър с инсталиран JDK 9 има етикета
      <code>jdk9</code>
      ).
    </dd>

    <dt><code>postgres &amp;&amp; !vm &amp;&amp; (linux || freebsd)</code></dt>
    <dd>
      Изгражданията на този проект може да са на всеки агент под Linux или
      FreeBSD, стига да
      <i>не</i>
      са във виртуална машина, и да е инсталирана базата PostgreSQL (като
      приемаме, че на всяка машина са поставени съответните етикети, напр. всяка
      виртуална машина е с етикет
      <code>vm</code>
      , иначе примерът няма да сработи).
    </dd>
  </dl>
</div>
